package IHM;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

import org.jdom.Element;

/**
 * Classe de gestion de la zone de texte
 * @author Aubry Thomas
 * @author Bouchet Sylvain
 * @author Fauvel Alexis
 * @author Lessieur Jocelyn
 * @author Mathias Bastien 
 * @author Teuf Antoine
 * @version 1.0
 */
public class ZoneTexte extends JPanel implements MouseListener,CaretListener,FocusListener{

	/**
	 * JTextePane permetant la saisie du texte
	 * @see ZoneTexte#getJTextPane()
	 * @see ZoneTexte#getdoc()
	 * @see ZoneTexte#getSelectText()
	 * @see ZoneTexte#getText()
	 * @see ZoneTexte#setSelectText(String)
	 * @see ZoneTexte#setText(String)
	 */
	private JTextPane zoneTexte;
	
	/**
	 * L'instance de l'IHM de l'application
	 */
	private IHM ihm;
	
	/**
	 * Police d'ecriture pas defaut
	 */
	private Font fontDefaut;

	/**
	 * Constructeur de ZoneTexte
	 * @param ihm	la classe ihm 
	 */
	public ZoneTexte(IHM ihm) {
		this.ihm = ihm;
		zoneTexte = new JTextPane();
		zoneTexte.setPreferredSize(new Dimension(getWidth(), 100));
		zoneTexte.addMouseListener(this);
		zoneTexte.addCaretListener(this);
		JScrollPane scroll = new JScrollPane(zoneTexte);
		setLayout(new BorderLayout());
		add(scroll, BorderLayout.CENTER);
		setBorder(BorderFactory.createLineBorder(Color.lightGray, 2));
		setVisible(true);
		
		zoneTexte.setFocusCycleRoot(true);
		zoneTexte.addFocusListener(this);
		fontDefaut=zoneTexte.getFont();
		setCommentaire(true);
		
	}

	/**
	 * Permet d'afficher le commentaire de la zone de texte
	 * @param b	true ou false selon si on affiche ou non le commentaire
	 */
	public void setCommentaire(boolean b){
		if(b){
			zoneTexte.setFont(new Font("Arial",Font.PLAIN,20));
			zoneTexte.setForeground(Color.gray);
			zoneTexte.setText("Tapez votre paragraphe ici !");
		}
		else{
			zoneTexte.setFont(new Font("Monospaced", Font.PLAIN, 12));
			zoneTexte.setForeground(Color.black);
			zoneTexte.setText("");
		}
			
	}
	
	/**
	 * Permet de recuperer le JTextPane de la zone de texte
	 * @return	le JTextPane de la zone de texte
	 */
	protected JTextPane getJTextPane() {
		return zoneTexte;
	}

	/**
	 * Permet de remplacer le texte du JtextPane
	 * @param text	nouveau texte a mettre 
	 */
	protected void setText(String text) {
		zoneTexte.setText(text);
	}

	/**
	 * Permet de recuperer le texte de la zone de texte
	 * @return	le texte dans un String
	 */
	protected String getText() {
		return zoneTexte.getText();
	}
	
	/**
	 * Permet de recuperer le StyledDocument associé au JTextPane
	 * @return	le StyledDocument
	 */
	protected StyledDocument getdoc() {
		return zoneTexte.getStyledDocument();
	}

	/**
	 * Permet de remplacer le texte selectionné
	 * @param text	texte a mettre a la place du texte selectionné
	 */
	protected void setSelectText(String text) {
		zoneTexte.replaceSelection(text);
	}

	/**
	 * Permet de recuperer le texte selectionné
	 * @return	le texte selectionné
	 */
	protected String getSelectText() {
		return zoneTexte.getSelectedText();
	}

	public void focusGained(FocusEvent e) {
		// TODO Auto-generated method stub
		if(zoneTexte.getFont()!=fontDefaut && zoneTexte.getText().equals("Tapez votre paragraphe ici !")){
			setCommentaire(false);
			ihm.getToolBar().activerBtnParagraphe(true);
		}
	}

	@Override
	public void focusLost(FocusEvent e) {
		// TODO Auto-generated method stub
		if(zoneTexte.getText().equals("")){
			setCommentaire(true);
			ihm.getToolBar().activerBtnParagraphe(false);
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		StyledDocument doc=zoneTexte.getStyledDocument();
		int pos=0;
		if(zoneTexte.getCaretPosition()!=0){
			pos=zoneTexte.getCaretPosition()-1;
		}
		if(!ihm.getModif()){
			ihm.getToolBar().setToggle(StyleConstants.isBold(doc.getCharacterElement(pos).getAttributes()),
								   	   StyleConstants.isItalic(doc.getCharacterElement(pos).getAttributes()),
								   	   StyleConstants.isUnderline(doc.getCharacterElement(pos).getAttributes()),
								   	   StyleConstants.isStrikeThrough(doc.getCharacterElement(pos).getAttributes()));
		}
		else{
			ihm.getToolBarModif().setToggle(StyleConstants.isBold(doc.getCharacterElement(pos).getAttributes()),
				   	   						StyleConstants.isItalic(doc.getCharacterElement(pos).getAttributes()),
				   	   						StyleConstants.isUnderline(doc.getCharacterElement(pos).getAttributes()),
				   	   						StyleConstants.isStrikeThrough(doc.getCharacterElement(pos).getAttributes()));
		}
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void caretUpdate(CaretEvent e) {
		// TODO Auto-generated method stub
		StyledDocument doc=zoneTexte.getStyledDocument();
		int pos=0;
		if(zoneTexte.getCaretPosition()!=0){
			pos=zoneTexte.getCaretPosition()-1;
		}
		if(!ihm.getModif()){
			ihm.getToolBar().setToggle(StyleConstants.isBold(doc.getCharacterElement(pos).getAttributes()),
								   	   StyleConstants.isItalic(doc.getCharacterElement(pos).getAttributes()),
								   	   StyleConstants.isUnderline(doc.getCharacterElement(pos).getAttributes()),
								   	   StyleConstants.isStrikeThrough(doc.getCharacterElement(pos).getAttributes()));
		}
		else{
			ihm.getToolBarModif().setToggle(StyleConstants.isBold(doc.getCharacterElement(pos).getAttributes()),
				   	   						StyleConstants.isItalic(doc.getCharacterElement(pos).getAttributes()),
				   	   						StyleConstants.isUnderline(doc.getCharacterElement(pos).getAttributes()),
				   	   						StyleConstants.isStrikeThrough(doc.getCharacterElement(pos).getAttributes()));
		}
	}
}
